// pages/voice2text/index.js
const app = getApp();
//引入插件：微信同声传译
const plugin = requirePlugin('WechatSI');
//获取全局唯一的语音识别管理器recordRecoManager
const manager = plugin.getRecordRecognitionManager();
import errorCode from '../../assets/data/errCode'
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
    //语音
    recordState: false, //录音状态
    content:'',//内容
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    console.log('load');
    //识别语音
    this.initRecord();
  },

  onShow(){
    this.getRecordAuth()
  },

  // 权限询问
  getRecordAuth: function() {
    wx.getSetting({
      success: (res) => {
        console.log("succ")
        console.log(res)
        if (!res.authSetting['scope.record']) {
          wx.authorize({
            scope: 'scope.record',
            success() {
                // 用户已经同意小程序使用录音功能，后续调用 wx.startRecord 接口不会弹窗询问
                console.log("succ auth")
            }, fail() {
                console.log("fail auth")
            }
          })
        } else {
          console.log("record has been authed")
        }
      }, fail(res) {
          console.log("fail")
          console.log(res)
      }
    })
  },

  // 手动输入内容
  conInput: function (e) {
    this.setData({
      content:e.detail.value,
    })
  },
  //识别语音 -- 初始化
  initRecord: function () {
    const that = this;
    // 有新的识别内容返回，则会调用此事件
    manager.onRecognize = function (res) {
      console.log(res)
      if (res.result === '') return
      const text = that.data.content + res.result
      that.setData({
        content: text
      })
    }
    // 正常开始录音识别时会调用此事件
    manager.onStart = function (res) {
      console.log("成功开始识别", res)
    }
    // 识别错误事件
    manager.onError = function (res) {
      console.error("error msg", res)
      const err = errorCode.filter(item => item.retcode === res.retcode)[0]
      const { text, title, icon } = err
      console.log(text);
      title !== '' && wx.showToast({
        title,
        icon
      })
    }
    //识别结束事件
    manager.onStop = function (res) {
      console.log('..............结束录音')
      console.log('录音临时文件地址 -->' + res.tempFilePath); 
      console.log('录音总时长 -->' + res.duration + 'ms'); 
      console.log('文件大小 --> ' + res.fileSize + 'B');
      console.log('语音内容 --> ' + res.result);
      if (res.result == '') {
        // wx.showModal({
        //   title: '提示',
        //   content: '听不清楚，请重新说一遍！',
        //   showCancel: false,
        //   success: function (res) {}
        // })
        that.playTextToVoice('听不清楚，请重新说一遍！')
        return;
      }
      var text = that.data.content + res.result;
      that.setData({
        content: text
      })


      setTimeout(() => {
        that.playTextToVoice(text)
        // that.playTextToVoice(content)
      }, 3000)
    }
  },
  //语音  --按住说话
  touchStart: function (e) {
    console.log('start');
    // 防止 -30011
    if (this.data.recordState) return
    this.setData({
      recordState: true  //录音状态
    })
    // 语音开始识别
    manager.start({
      lang: 'zh_CN',// 识别的语言，目前支持zh_CN en_US zh_HK sichuanhua
    })
  },

  //语音  --松开结束
  touchEnd: function (e) {
    console.log('end');
    // 防止重复触发stop函数 -30012
    if(!this.data.recordState) {
      console.warn("has finished!")
      return
    }
    this.setData({
      recordState: false
    })
    // 语音结束识别
    manager.stop();
  },

  // 文字转语音
  playTextToVoice(content){
    //创建内部 audio 上下文 InnerAudioContext 对象。
    this.innerAudioContext = wx.createInnerAudioContext();
    const that = this;
    plugin.textToSpeech({
      // 调用插件的方法
      lang: 'zh_CN',
      // lang: 'en_US',
      content,
      success: function (res) {
        that.playAudio(res.filename);
      }
    });
  },

  // 播报语音
  playAudio(e) {
    this.innerAudioContext.src = e; //设置音频地址
    this.innerAudioContext.play(); //播放音频
  },

    /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    this.innerAudioContext.stop();
    this.innerAudioContext.destroy();
  },
})